﻿package cn.lite3.utils
{
	import flash.net.getClassByAlias;
	import flash.net.registerClassAlias;
	import flash.utils.ByteArray;
	import flash.utils.getQualifiedClassName;
	
	/**
	 * 欢迎访问我的博客
	 * www.lite3.cn
	 * lite3@qq.com
	 * @author lite3
	 */
	public class ObjectUtil 
	{
		
		/**
		 * 对象深度复制 : 将实例及子实例的所有成员(属性和方法, 静态的除外)都复制一遍, (引用要重新分配空间!)
		 * 
		 * 局限性 : 
		 * 			1. 不能对显示对象进行复制
		 * 			2. obj的必须有默认构造函数(参数个数为0,或都有默认值)
		 * 			3. obj 里有obj类型 之外 的非内置数据类型时, 返回类型将不确定
		 * 					
		 * 
		 * @param	obj	<b>	*		</b> 深复制的对象
		 * @return
		 */
		static public function deepClone(obj:*):*
		{
			var aliasClass:Class;
			var classDefinition:Class = Object(obj).constructor as Class;
			var className:String = getQualifiedClassName(obj);
			
			// 获取已注册 obj的类名的类型
			try {
				aliasClass = getClassByAlias(className);
			}catch (err:Error) { }
			
			// 没有注册 AliasName
			if (!aliasClass)
			{
				registerClassAlias(className, classDefinition);
			}
			// 已经注册了 AliasName ,且不是它的全类名,要重新注册个
			else if (aliasClass != classDefinition)
			{
				registerClassAlias(className +":/:" + className, classDefinition);
			}
			//else
			// 注册的AliasName 为 全类名
			
			var byteArray:ByteArray = new ByteArray();
			byteArray.writeObject(obj);
			byteArray.position = 0;
			return byteArray.readObject();
		}
	}
}